package single;


/**
 * 单例思想：
 * 解决一个类在内存中只存在一个对象
 *
 * 保证对象的唯一：
 * 1.为了避免其他程序过多的建立该对象，先禁止其他程序建立该类对象：将构造函数私有化
 * 2.为了让其他程序可以访问到该类对象，只好在本类中自定义一个对象
 * 3.为了方便其他程序对自定义的对象的访问，可以对外提供一些访问方式
 *
 */
class SingltonDemo{
    /**
     * 假设一个房子的名字是唯一的，比如叫”别墅1“当物业设定好这套房子的名字是叫什么的时候，我再去问s1这套房子叫什么名字，那么肯定是“别墅1”
     * @param args
     */
    public static void main(String[] args){
        Singlton s = Singlton.getInstance();
        s.setHouse("别墅1");
        Singlton s1 = Singlton.getInstance();
        System.out.println(s1.getHouse());
    }
}

class Singlton {


    private String house;

    public String getHouse() {
        return house;
    }

    public void setHouse(String house) {
        this.house = house;
    }

    /*单例设计模式代码start**********************/
    //声明本类引用类型变量，但是不要创建对象
    private static Singlton single;

    //私有化构造函数；
    private Singlton(){}

    /**
     * 懒汉单例设计模式
     * 其中增加了一个synchronized为了防止线程不安全产生的潜在问题
     * 在synchronized前加了一个if判断是为了防止每一次对该对象进行获取的时候都进行锁，
     * 加了if后只有第一次执行的可能慢一点
     * @return
     */
    //声明一个公共的静态方法，来获取本类的对象
    public static Singlton getInstance(){
        if (single == null){
            synchronized ("lock"){
                if (single == null){
                    single = new Singlton();
                }
            }
        }
        return single;
    }
    /*单例设计模式代码end**********************/
}

